#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/socket.h>
#include <string.h>


/**
 * 只有支持一个客户端的服务器
 * @return
 */
int main() {

    int ret = -1;

    //创建套接字
    int socket_fd = socket(AF_INET,SOCK_STREAM,0);
    if(socket_fd == -1){
        perror("socket");
        goto error;
    }
    //绑定
    //  IP4 协议 套接字结构体
    struct sockaddr_in addr;
    //      IP4 协议 套接字结构体 协议
    addr.sin_family = AF_INET;
    //      IP4 协议 套接字结构体 端口
    addr.sin_port = htons(8080);
    //      IP4 协议 套接字结构体 ip地址
    inet_pton(AF_INET,"192.168.137.131",&addr.sin_addr.s_addr);
    // 设置端口复用
    int opt = 1;
    setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    //  通配的赋值，也就是有几个网卡就赋值几个
    // addr.sin_addr.s_addr = INADDR_ANY;
    ret = bind(socket_fd,(struct sockaddr *)&addr,sizeof(addr));
    if(ret == -1){
        perror("bind");
        goto error;
    }
    //监听
    ret = listen(socket_fd,128);
    if(ret == -1){
        perror("listen");
        goto error;
    }
    //提取
    struct sockaddr_in client_addr;
    socklen_t len = sizeof(client_addr);
    int to_clent_fd = accept(socket_fd,(struct sockaddr *)&client_addr,&len);
    if(to_clent_fd == -1){
        perror("listen");
        goto error;
    }
    char client_ip[16] = "";
    printf("客户端：%s : %d 链接了服务器!\n", inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,client_ip,16), ntohs(client_addr.sin_port));
    //读写 可以建立读写线程来完成操作
    while(1){
        char buff[1024] = "";
        write(to_clent_fd,"hello,world!",12);
        int n = read(to_clent_fd,buff, sizeof(buff));
        // 代表对方关闭了
        if(n == 0){
            printf("客户端：%s : %d 关闭了与服务器的链接!\n", inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,client_ip,16), ntohs(client_addr.sin_port));
            break；
        }
        printf("%s",buff);
    }

    //关闭

    close(socket_fd);
    close(to_clent_fd);
    return 0;
    error : close(socket_fd);
    return 1;
}

